package br.com.controller.aluno;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;

import br.com.arquitetura.controlador.AbstractMBean;
import br.com.arquitetura.excecoes.BDException;
import br.com.arquitetura.servico.ServiceCadastro;
import br.com.controller.util.CPFValidator;
import br.com.data.hibernate.AlunoHibernateDAO;
import br.com.data.hibernate.EscolaHibernateDAO;
import br.com.data.hibernate.UsuarioHibernateDAO;
import br.com.model.entidade.Aluno;
import br.com.model.entidade.Escola;
import br.com.model.entidade.Usuario;
import br.com.util.setup.StringToMD5;

@ManagedBean
@ViewScoped
public class MBAluno extends AbstractMBean<Aluno>{
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private Aluno aluno;
	private List<Aluno> alunos;
	private String senhaRepetida;
	private String escola;
	private Date nascimento;
	private Date nascimento_resp;
	private List<String> estados;
	private List<String> cidades;
	private EscolaHibernateDAO escolaHibernateDao;
	private AlunoHibernateDAO alunoHibernateDao;
	private UsuarioHibernateDAO usuarioHibernateDao;
	private Aluno alunoVizualizacao;
	
	@ManagedProperty(value="#{serviceCadastro}")
	private ServiceCadastro serviceCadastro;
	
	public void setServiceCadastro(ServiceCadastro serviceCadastro) {
		this.serviceCadastro = serviceCadastro;
	}
	
	public MBAluno(){
		alunoVizualizacao = new Aluno();
		alunoHibernateDao = (AlunoHibernateDAO) getBean("alunoHibernateDAO");
		escolaHibernateDao = (EscolaHibernateDAO) getBean("escolaHibernateDAO");
		usuarioHibernateDao = (UsuarioHibernateDAO) getBean("usuarioHibernateDAO");
		limpar();
		
	}
	
	public void gerarMatricula(){
		boolean teste = true;
		
		while(teste){
			Date d = new Date();
			String matricula = (d.getYear()+1900) + "";
			int num = (int) (Math.random() * 10);
			matricula += num + "";
			num = (int) (Math.random() * 10);
			matricula += num + "";
			num = (int) (Math.random() * 10);
			matricula += num + "";
			num = (int) (Math.random() * 10);
			matricula += num + "";
			
			if (usuarioHibernateDao.getByField(Usuario.class, "matricula", matricula) != null){
				if (usuarioHibernateDao.getByField(Usuario.class, "matricula", matricula).isEmpty()){
					this.aluno.getUsuario().setMatricula(matricula);
					teste = false;
				}
			}
		}
		
		
	}
	
	public void carregarCidades(){
		if(aluno.getEstado().contentEquals("RN")){
			System.out.println("selecionou rn");
			this.cidades = new ArrayList<String>();
			cidades.add("Natal");
			cidades.add("Parnamirim");
			cidades.add("Macaiba");
		}
		if(aluno.getEstado().contentEquals("PB")){
			this.cidades = new ArrayList<String>();
			System.out.println("selecionou PB");
			cidades.add("Campina Grande");
			cidades.add("Patos");
			cidades.add("Joao Pessoa");
		}
		if(aluno.getEstado().contentEquals("")){
			this.cidades = new ArrayList<String>();
			System.out.println("selecionou nada");
			cidades.add("Selecione um estado");
			
		}
	}
	
	
	public Aluno getAluno() {
		return aluno;
	}
	public void setAluno(Aluno aluno) {
		if (aluno.getEscola()!=null){
			this.escola = aluno.getEscola().getNome();
		}
		this.aluno = aluno;
	}
	
	public void irEditar(){
		this.carregarCidades();
		this.nascimento = this.aluno.getNascimento().getTime();
		this.nascimento_resp = this.aluno.getNascimento_resp().getTime();
	}
	
	public void cadastrar(){
		try {
			if (this.aluno.getUsuario().getSenha().compareTo(senhaRepetida)==0){
				this.aluno.setEscola(this.escolaHibernateDao.getByField(Escola.class,"nome", escola).get(0));
				Calendar cn = Calendar.getInstance();
				cn.setTime(nascimento);
				Calendar cnr = Calendar.getInstance();
				cnr.setTime(nascimento_resp);
				aluno.setNascimento(cn);
				aluno.setNascimento_resp(cnr);
				List<String> permissoes = new ArrayList<String>();
				permissoes.add("ALUNO");
				
				aluno.getUsuario().setPermissoes(permissoes);
				aluno.getUsuario().setSenha(StringToMD5.md5(senhaRepetida));
			
				
				if (this.aluno.getUsuario().getCpf().isEmpty() || CPFValidator.validar(this.aluno.getUsuario().getCpf())){
					Usuario u = aluno.getUsuario();
					
					this.gerarMatricula(); 
					
					serviceCadastro.salvar(u);
					
					aluno.setUsuario(u);
					
					serviceCadastro.salvar(aluno);
					this.limpar();
					FacesContext.getCurrentInstance().addMessage(null,new FacesMessage("Sucesso", "Aluno cadastrado com sucesso!"));
				}else{
					addFacesErrorMessage("CPF Inválido");
				}
				
				
			}else{
				FacesContext.getCurrentInstance().addMessage(null,new FacesMessage("Aviso", "Senhas nao conferem!"));
			}
			
		} catch (BDException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			FacesContext.getCurrentInstance().addMessage(null,new FacesMessage("Erro", "Erro ao cadastrar!"));
		}
	}
	
	public void editar(){
		try {
			this.aluno.setEscola(this.escolaHibernateDao.getByField(Escola.class,"nome", escola).get(0));
			Calendar cn = Calendar.getInstance();
			cn.setTime(nascimento);
			Calendar cnr = Calendar.getInstance();
			cnr.setTime(nascimento_resp);
			aluno.setNascimento(cn);
			aluno.setNascimento_resp(cnr);
			serviceCadastro.atualizar(aluno);
			this.limpar();
			FacesContext.getCurrentInstance().addMessage(null,new FacesMessage("Sucesso", "Aluno editado com sucesso!"));
		} catch (BDException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			FacesContext.getCurrentInstance().addMessage(null,new FacesMessage("Erro", "Erro ao editar!"));
		}
	}
	
	public void excluir(){
		try {
			System.out.println(aluno.getId());
			serviceCadastro.excluir(aluno);
			this.limpar();
			FacesContext.getCurrentInstance().addMessage(null,new FacesMessage("Sucesso", "Aluno excluido com sucesso!"));
		} catch (BDException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			FacesContext.getCurrentInstance().addMessage(null,new FacesMessage("Erro", "Erro ao excluir!"));
		}
	}
	
	public void limpar(){
		this.aluno = new Aluno();
		this.alunos = new ArrayList<Aluno>();
		this.senhaRepetida = "";
		this.escola = "";
		this.nascimento = null;
		this.nascimento_resp = null;
		this.estados = new ArrayList<String>();
		this.cidades = new ArrayList<String>();
		this.estados.add("RN");
		this.estados.add("PB");
		alunos = alunoHibernateDao.listAll(Aluno.class);
	}
	
	public List<Aluno> getAlunos() {
		return alunos;
	}
	public void setAlunos(List<Aluno> alunos) {
		this.alunos = alunos;
	}
	public String getSenhaRepetida() {
		return senhaRepetida;
	}
	public void setSenhaRepetida(String senhaRepetida) {
		this.senhaRepetida = senhaRepetida;
	}
	public String getEscola() {
		return escola;
	}
	public void setEscola(String escola) {
		this.escola = escola;
	}
	public Date getNascimento() {
		return nascimento;
	}
	public void setNascimento(Date nascimento) {
		this.nascimento = nascimento;
	}
	public Date getNascimento_resp() {
		return nascimento_resp;
	}
	public void setNascimento_resp(Date nascimento_resp) {
		this.nascimento_resp = nascimento_resp;
	}

	public List<String> getEstados() {
		return estados;
	}

	public void setEstados(List<String> estados) {
		this.estados = estados;
	}

	public List<String> getCidades() {
		return cidades;
	}

	public void setCidades(List<String> cidades) {
		this.cidades = cidades;
	}

	public Aluno getAlunoVizualizacao() {
		return alunoVizualizacao;
	}

	public void setAlunoVizualizacao(Aluno alunoVizualizacao) {
		this.alunoVizualizacao = alunoVizualizacao;
	}
	
	
}
